package com.tzl.design_pattern.strategy_pattern;

import java.math.BigDecimal;
import java.util.Scanner;

/**
 * 策略模式：<br>
 * &nbsp;&nbsp;是指定义了不同的算法逻辑，并将其封装起来，让他们之间可以相互替换，此模式可以让算法逻辑发生变化时不会影响到使用算法逻辑的用户。可以用于改造代码中的if-else逻辑
 * <br>
 * 使用场景: <br>
 * &nbsp;&nbsp;同一个系统中存在不同的逻辑算法，而彼此之间在不同场景中需要实现动态替换。 <br>
 * 优点: <br>
 * &nbsp;&nbsp;1. 策略模式符合开闭原则；<br>
 * &nbsp;&nbsp;2. 避免使用多重条件转移语句，如if-else等<br>
 * &nbsp;&nbsp;3. 使用策略模式可以提高逻辑算法的保密性和安全性<br>
 * 缺点: <br>
 * &nbsp;&nbsp;1. 使用者必须知道所有的策略,并且自行决定使用哪一个策略类.<br>
 * &nbsp;&nbsp;2. 代码中会产生非常多策略类,增加维护难度.<br>
 *
 * @author Zhilei Tang
 * @date Created in 2020/11/14 17:06
 */
public class StrategyTest {
  public static void main(String[] args) {
    //        String payType;
    //        PayStrategy payStrategy;
    //        Scanner sc = new Scanner(System.in);
    //        payType = sc.nextLine();
    //
    //        switch (payType) {
    //            case "aliPay":
    //                payStrategy = new AliPayStrategy();
    //                break;
    //            case "wechatPay":
    //                payStrategy = new WechatPayStrategy();
    //                break;
    //            default:
    //                throw new RuntimeException("支付方式错误");
    //        }
    //
    //        System.out.println(payStrategy.pay(new BigDecimal("32.43")));
    //        System.out.println(payStrategy.queryBalance("唐志磊"));
    // 利用枚举的方式改造，减少判断逻辑
    String payType;
    Scanner sc = new Scanner(System.in);
    payType = sc.nextLine();
    PayTypeEnum payTypeEnum = PayTypeEnum.valueOf(payType);
    PayStrategy payStrategy = PayTypeFactory.getPayType(payTypeEnum);

    System.out.println(payStrategy.pay(new BigDecimal("43.432")));
    System.out.println(payStrategy.queryBalance("唐志磊"));
  }
}
